package com.example.demo.controller;

import com.example.demo.dto.ChatRequest;
import com.example.demo.dto.ChatResponse;
import com.example.demo.dto.RecipeResponse;
import com.example.demo.service.ChatService;
import org.springframework.web.bind.annotation.*;
import lombok.RequiredArgsConstructor;

/**
 * AI聊天控制器
 * 提供与DeepSeek AI进行对话的REST API接口
 * 
 * @author AI Demo
 * @version 1.0
 */
@RestController
@RequestMapping("/api/v2/chat")
@CrossOrigin(origins = "*") // 允许跨域访问
@RequiredArgsConstructor
public class ChatController {

    private final ChatService chatService;

    /**
     * 发送普通聊天消息
     * 
     * @param request 聊天请求对象，包含用户消息
     * @return ChatResponse 聊天响应对象，包含用户消息和AI回复
     */
    @PostMapping("/message")
    public ChatResponse sendMessage(@RequestBody ChatRequest request) {
        // 调用聊天服务获取AI回复
        String response = chatService.chat(request.getMessage());

        // 构建响应对象
        ChatResponse chatResponse = new ChatResponse(request.getMessage(), response);
        // 如果请求中包含系统消息，则设置到响应中
        if (request.getSystem() != null) {
            chatResponse.setSystem(request.getSystem());
        }
        return chatResponse;
    }

    /**
     * 发送带系统消息的聊天请求
     * 系统消息用于设定AI的角色和行为模式
     * 
     * @param request 聊天请求对象，包含用户消息和可选的系统消息
     * @return ChatResponse 聊天响应对象，包含完整的对话信息
     */
    @PostMapping("/system-message")
    public ChatResponse sendSystemMessage(@RequestBody ChatRequest request) {
        // 如果请求中没有系统消息，则使用默认的美食专家角色
        String systemMessage = request.getSystem() != null ?
                request.getSystem() : "你是一个美食专家，当发送一个菜品名称给你后，你需要返回该菜品的制作配料以及制作方法。";
        
        // 调用带系统消息的聊天服务
        String response = chatService.chatWithSystem(request.getMessage(), systemMessage);

        // 构建响应对象并设置系统消息
        ChatResponse chatResponse = new ChatResponse(request.getMessage(), response);
        chatResponse.setSystem(systemMessage);
        return chatResponse;
    }

    /**
     * 查询菜品制作信息
     * 使用固定的美食专家角色，根据菜品名称获取制作配料和制作方法
     * 
     * @param dishName 菜品名称
     * @return 包含制作配料和制作方法的结构化菜品信息
     */
    @GetMapping("/recipe")
    public RecipeResponse getRecipe(@RequestParam String dishName) {
        return chatService.getRecipe(dishName);
    }
}